/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Proxy;

import Servidor.DadosObjeto;
import java.util.ArrayList;

/**
 *
 * @author Murilo
 */
public class CacheProxy {

    private static ArrayList<Servidor.DadosObjeto> CacheProxy;
    private static int TamanhoTotalCache;
    private static int TamanhoDisponivelCache;

    public CacheProxy() {
    }

    public static synchronized void setTamanhoCache(int tam) {
        TamanhoTotalCache = tam;
    }

    public static synchronized int getTamanhoCache() {
        return TamanhoTotalCache;
    }
    
    public static synchronized void setTamanhoDisponivelCache(int tam){
        TamanhoDisponivelCache = tam;
    }
    
    public static synchronized int getTamanhoDisponivelCache() {
        return TamanhoDisponivelCache;
    }

    public static synchronized ArrayList<Servidor.DadosObjeto> cacheProxy() {
        if (CacheProxy == null) {
            CacheProxy = new ArrayList<>();
        }
        return CacheProxy;
    }

    public static synchronized void insereObjetoCache(String dados) {
        DadosObjeto obj = new DadosObjeto();
        boolean estaNaCache = false;
        String[] aux = dados.split("/");
        obj.setIdObjeto(Integer.valueOf(aux[0]));
        obj.setTamanhoBytes(Integer.valueOf(aux[1]));
        for(DadosObjeto aux1 : cacheProxy()){
            if(aux1.getIdObjeto() == obj.getIdObjeto()){
                estaNaCache = true;
            }
        }
        //se tiver espaço disponivel e o tamanho do obj não for maior que o tamanho total da cache insere
        if (obj.getTamanhoBytes() < TamanhoTotalCache && obj.getTamanhoBytes() <= TamanhoDisponivelCache && !estaNaCache) {
            //add o obj na cache
            cacheProxy().add(obj);
            //atualiza o tamanho disponivel em cache
            TamanhoDisponivelCache = TamanhoDisponivelCache - obj.getTamanhoBytes();
        } else if (obj.getTamanhoBytes() > TamanhoDisponivelCache && !estaNaCache) {
            while (obj.getTamanhoBytes() > TamanhoDisponivelCache) {
                DadosObjeto objRetirarCache = new DadosObjeto();
                objRetirarCache.setTamanhoBytes(0);
                //pega o objeto com maior tamanho
                for (DadosObjeto objAux : cacheProxy()) {
                    if (objAux.getTamanhoBytes() > objRetirarCache.getTamanhoBytes()) {
                        objRetirarCache.setTamanhoBytes(objAux.getTamanhoBytes());
                        objRetirarCache.setIdObjeto(objAux.getIdObjeto());
                    }
                }
                //remove objeto
                ArrayList<Servidor.DadosObjeto> cache = new ArrayList<>();
                for (DadosObjeto objAux : CacheProxy) {
                    if (objAux.getIdObjeto() != objRetirarCache.getIdObjeto()) {
                        
                        //cacheProxy().remove(objRetirarCache);
                        cache.add(objAux);
                    }
                    else {
                        TamanhoDisponivelCache += objRetirarCache.getTamanhoBytes();
                        System.out.println("ObjetoRemovido: ID: " + objRetirarCache.getIdObjeto());
                        System.out.println("ObjetoRemovido: TamanhoBytes: " + objRetirarCache.getTamanhoBytes());
                    }
                }
                CacheProxy = cache;
                cacheProxy().add(obj);
                TamanhoDisponivelCache -= obj.getTamanhoBytes();
            }
        }
        System.err.println("Bytes Disponivel Cache: " + TamanhoDisponivelCache);
    }
}
